import java.util.ArrayList;
import java.util.HashMap;

public class FarmProductsService {

    private ArrayList<String> key;         // 序号表
    private HashMap<String, FarmProducts> elements; // 数据表

    public int size() {
        return key.size();
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    /**
     * 用途：用来初始化 FarmProducts 数组
     * 参数：totalFarmProducts：指定 FarmProducts 数组的最大空间
     */
    public void init(int totalFarmProducts) {
        key = new ArrayList<>();
        elements = new HashMap<>();
    }

    /**
     * 用途：将参数 FarmProducts 添加至数组中最后一个农产品对象记录之后
     * 参数：FarmProducts 指定要添加的农产品对象
     * 返回：添加成功返回 true；false 表示数组已满，无法添加
     */
    public boolean addFarmProducts(FarmProducts farmProducts) {
        String type = farmProducts.getType();
        key.add(type);
        elements.put(type, farmProducts);
        return true;
    }

    /**
     * 用途：用参数 FarmProducts 替换数组中由 index 指定的对象
     * 参数：FarmProducts 指定替换的新农产品对象 index 指定所替换对象在数组中的位置
     * 返回：替换成功返回 true；false 表示索引无效，无法替换
     */
    public boolean replaceFarmProducts(int index, FarmProducts fp) {
        if (indexLegal(index)) return false;
        String old = key.get(index);
        key.set(index, fp.getType());
        elements.replace(old, fp);
        return true;
    }

    /**
     * 用途：检验 index 索引值是否合法
     * 返回：合法返回 true；false 表示索引无效，给出提示
     */
    private boolean indexLegal(int index) {
        if (index < 0 || index >= elements.size()) {
            System.out.println("参数不合法");
            return true;
        }
        return false;
    }

    /**
     * 用途：从数组中删除参数 index 指定索引位置的农产品对象记录
     * 参数：index 指定所删除对象在数组中的索引位置
     * 返回：删除成功返回 true；false 表示索引无效，无法删除
     */
    public boolean deleteFarmProducts(int index) {
        if (indexLegal(index)) return false;
        FarmProducts fp = getFarmProducts(index);
        String del = fp.getType();
        key.remove(index);
        elements.remove(del);
        return true;
    }

    /**
     * 用途：返回数组中记录的所有农产品对象
     * 返回：FarmProducts[] 数组中包含了当前所有农产品对象，该数组长度与对象个数相同。
     */
    public FarmProducts[] getAllFarmProducts() {
        if (elements.isEmpty()) return null;
        FarmProducts[] res = new FarmProducts[elements.size()];
        for (int i = 0; i < res.length; i++)
            res[i] = getFarmProducts(i);
        return res;
    }

    /**
     * 用途：返回参数 index 指定索引位置的农产品对象记录
     * 参数：index 指定所要获取的农产品对象在数组中的索引位置
     * 返回：封装了农产品信息的 FarmProducts 对象
     */
    public FarmProducts getFarmProducts(int index) {
        if (indexLegal(index)) return null;
        return elements.get(key.get(index));
    }
}
